/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Comandos;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.ErroSemantico;
import analiseSemantica.Tipos.TipoSemantico;
import analiseSemantica.Tipos.TiposSemanticos;
import analiseSintatica.AnalisadorSintatico;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.Regras.Expressoes.RegraExpressao;

import java.util.LinkedList;

/**
 *
 * @author Edney
 */
public class RegraDoWhile extends Regra {

    protected static Regra instancia;

    protected String estrutura = "do <bloco> while '(' <expressao> ')' ';'";
    
    /**
     * Construtor privado necessario ao singleton
     */
    private RegraDoWhile() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraDoWhile getInstance() {
        if (instancia == null) {
            instancia = new RegraDoWhile();
        }
        return (RegraDoWhile) instancia;
    }

    //edney da fazendo a semantica

    @Override
    public TiposSemanticos analisar(LinkedList<LinkToken> tokens) throws ErroSintaticoException {
       

            tokens.removeFirst();
            TiposSemanticos tipobloco = RegraBloco.getInstance().analisar(tokens);

            reconheceToken(tokens, "while", estrutura);
        	reconheceLexema(tokens, "delimitador", "(", estrutura);
        	
            
        	TiposSemanticos tipoexpressao = RegraExpressao.getInstance().analisar(tokens);
            if(tipoexpressao != null){
    	        TipoSemantico tipoexpr = tipoexpressao.removeTipos();
    	        String tipoexp = (String)tipoexpr.getTipo();
    	        if(!tipoexp.toLowerCase().equals("boolean")){
    	        	AnalisadorSintatico.errosemanticos.add(new ErroSemantico("Expressao deve ter valor booleano", tipoexpr.getLinha()));
    	        }
            }
        	reconheceLexema(tokens, "delimitador", ")", estrutura);
        	reconheceLexema(tokens, "delimitador", ";", estrutura);

        return tipobloco; // falta fazer a analise semantica pra ver o que vai retornar
    }

    /**
     * Reconhece terminal "do"
     * @param tokens - Tokens do codigo
     * @return - Sub-arvore sintatica
     */
    
    protected void setPrimeiro() {
        this.primeiro.add("do");
    }

  
}
